Skip to content

Python 使用 Selenium 抓取网页动态内容

背景

今年一直都在做 AI 相关的应用,自然接触 python 语言的机会也多了很多,也做了一些爬虫相关的工作,常用的例如 ScrapySelenium 等框架。

这里记录下 Selenium 如何动态抓取网页动态内容。

Selenium 介绍

Selenium 是一种用于自动化网页应用的工具集。它可以用来测试网页应用、爬取网页数据、模拟浏览器行为等。

Selenium 的主要优点包括:

  • 支持多种浏览器,包括 ChromeFirefoxEdgeInternet Explorer 等。
  • 支持多种编程语言,包括 PythonJavaC#JavaScript 等。
  • 易于使用,入门简单。
  • 功能强大,可以满足各种自动化需求。

Selenium 的主要缺点包括:

  • 需要安装浏览器驱动程序才能使用。
  • 某些操作需要使用 JavaScript 来实现。
  • 在某些情况下,自动化脚本可能会失败

安装环境

bash
pip install selenium

实战

介绍

任务:抓取讯飞文档文件列表,并截图

img

进入首页需要以下步骤:

  1. 进去讯飞文档登录页
  2. 隐私协议弹框同意
  3. 自动填入账号密码并登录
  4. 进入讯飞文档首页,等待首页数据加载后截图

代码实践

Click me to view the code
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from time import sleep

browser = webdriver.Edge()
# 设置浏览器窗口大小
browser.set_window_size(1200, 800)
browser.get('https://iflydocs.com/i/#/dashboard')

# 智能等待,在设置时间范围内,只要条件成立,马上结束等待, implicitly_wait
# 设置隐式等待时间为10秒  (看网速)
browser.implicitly_wait(10)

# 等待登录的输入框显示,默认等待 20s
WebDriverWait(browser,20).until(expected_conditions.visibility_of(browser.find_elements(By.CSS_SELECTOR,'.el-input__inner')[0])
)

# .el-button--primary 有两个按钮 第一个是登录按钮 第二个是隐私政策按钮
su_buttons = browser.find_elements(By.CSS_SELECTOR, '.el-button--primary')

# 说明有用户隐私协议弹框
if len(su_buttons) == 2:
    # 模拟用户隐私政策同意
    su_buttons[1].click()

# 同意用户协议的 checkbox
checkbox = browser.find_element(By.CSS_SELECTOR, '.el-checkbox__original')
# 点击这个原生即可
checkboxEl = browser.find_element(By.CSS_SELECTOR, '.el-checkbox')
if checkbox.is_selected() == False:
    checkboxEl.click()

# 填写用户信息
kw_inputs = browser.find_elements(By.CSS_SELECTOR, '.el-input__inner')
kw_inputs[0].send_keys('xxxx')
kw_inputs[1].send_keys('xxxx')

# 登录
su_buttons[0].click()

# 创建显示等待对象
wait_obj = WebDriverWait(browser, 10)
# 设置等待条件(等搜索结果的div出现)
# 这里设置等待用户头像出现
wait_obj.until(
    expected_conditions.presence_of_element_located(
        (By.CSS_SELECTOR, '.doc-item')
    )
)
# 等待1s
sleep(1)
# 截屏
browser.get_screenshot_as_file('python_result.png')

Released under the MIT License.